/* 
    es有6个原始类型：String、Number、Undefined、Null、Boolean、Symbol
        Object是一种无序名值对的集合
    3.4.1 typeof 操作符
        String 字符串
        Number 数值
        Undefined 未定义
        Object 对象或者Null
        function 函数
        symbol 符号
    3.4.2 undefined 当let和var初始化没有赋值时，就是undefined，相当于给其赋值了undefined
    3.4.3 null 类型同样只有一个值是null，逻辑上讲null是个空指针对象，所以类型是Object
        拓展：null == undefined // true 因为undefined是由null转化来的，表面上的值是想等的，但是==会为了比较转化他的操作数
            如果对象初始化的时候没有值用null来填充
    3.4.4 Boolean 类型 有true和false
        String(非空字符串) = true  String(“”) = false
        Number(非0数值) = true Number(0/NaN) = false
        Object(任意对象) = true Object(null) = false
        Undefined(N/A) = true Undefinde
    3.4.5 Number 类型 表示整数和浮点值
        展开：八进制（以8为基数）：以0开头范围是0-7，如果开头是0但是超出了应有的范围，就回去掉前面的0，后面的数字会被当成10进制处理
            十六进制：以0x开头，范围是0-9以及A-F
            使用八进制和十六进制创建的数值在所有数学操作中都被视为十进制数值。
        1.浮点值 数值中必须有小数点且小数点中必须有一个数
            展开：因为存储浮点值的内存空间是存储整数的2倍，所以小数点后面没有数值或者数值为0都会被转换成整数
            注意：0.1+0.2 不等于 0.3,因为浮点的精确度是小数点后17位，所以永远不要测试某个特定的浮点值
        2.值范围
            number类型的最大值存在Number.Max_Value中1.797 693 134 862 315 7e+308，超出转化成Infinity正无穷
            最小值存在Number.Min_Value中5e324，超出转化成-Infinity负无穷
            可以使用isFinite()来判断值是否超出范围
        3.NaN
            这个意思是不是数值，用于表示返回的数值失败了。
            一般用0除以任何数值都会报错，从而终止代码执行。
            0/0 -0/+0 返回的都是NaN
            5/0 5/-0 返回正无穷和负无穷
            注意：NaN有几个特性：
                1.NaN涉及的计算都等于NaN
                2.NaN不等于任何值包括NaN
            isNaN（）判断是否是数值，false是数值，true不是数值
        4.数值转换
            Number()   转型函数，可用于任何数据类型
                规则：布尔值 true是 1 false是 0
                    数值直接返回
                    null返回0
                    undefined返回NaN
                    字符串："1" 返回1
                            "1223" 返回1223
                            "011" 返回11
                            "1.1" 返回1.1
                            "0xf" 十六进制返回对应的十进制
                            "" 返回0
                            其他字符串返回NaN
                    对象：调用ValueOf()后再转换，调用toString()后再转换
            parseInt() 用于字符串转数字
                规则：0忽略
                    开头是非数值则是NaN
                    空字符串也是NaN
                    "1232ble" 转换成 1232
                    "22.1" 转换成 22
            parseFloat() 用于字符串转数字
                let num1 = parseFloat("1234blue"); // 1234，按整数解析 
                let num2 = parseFloat("0xA"); // 0 
                let num3 = parseFloat("22.5"); // 22.5 
                let num4 = parseFloat("22.34.5"); // 22.34 
                let num5 = parseFloat("0908.5"); // 908.5 
                let num6 = parseFloat("3.125e7"); // 31250000
    3.4.6 String类型
        单引号、双引号、反引号
        1.字符字面量
            \n  换行        \"      双引号
            \t  制表        \`      单引号
            \b  退格        \xnn    十六进制
            \r  回车        \unnnn  十六进制
            \f  换页
            \\  反斜杠\
            \'  单引号
        2.字符串的特点
            es的字符串变量是不可变的，如果想变需要销毁之前的字符串，然后将新值的另一个字符串保存到该变量。
        3.转换为字符串 toString()
            数值、布尔值、对象和字符串可以用
            null和undefined无法使用
            toString（2）可以接个底数参数，可以是2、8、10、16进制
            可以使用String(),null和undefined都可以使用转换成字面量文本
        4.模板字面量
        5.字符串插值
        6.模板字面量标签函数
        7.原始字符串
    3.4.7 Symbol 类型

    3.4.8 Object 类型
        对象就是一组数据和功能的集合。
        是所有对象的基类
        constructor：用于创建当前实例对象的函数。
        hasOwnProperty（propertyName）：判断当前实例对象是否存在给定的属性。
        isPrototypeOf(object)：用于判断当前对象是否为另一个对象的原型。
        propertyIsEnumerable(propertyName)：用于判断给定的属性是否可以使用。
        toLocaleString()：返回对象的字符串表示，该字符串反映对象所在的本地化执行环境。
        toString():返回对象的字符串表示。
        valueOf():返回对象的字符串、数值或布尔值表示。
*/

const http = require('http')
http.createServer((request, response) => {
    response.writeHead(200, { 'Content-Type': 'text/html' })
    response.end(typeof null)
}).listen(3000);
// console.log(typeof null) // object
// let message;
// console.log(typeof message) // undefined
// console.log(null == undefined) // true

let message = "Hello world!"; 
let messageAsBoolean = Boolean(message); 
console.log(messageAsBoolean, 'messageAsBoolean')
var O = new Object('a');
console.log(O.toString());
console.log(O.valueOf());
console.log(O.toLocaleString());




